import { _props, _text } from './canvas.js'
import { _polyline } from "./curve.js"
import { markInfo } from '../algorithm/mark.js'
import { _points } from './pathMode.js'

export const _mark = (ctx, { points, mark }, props) => {

    let mi = markInfo(points, mark)
    let { angle = true, edge = true, radius = false, labels = false,boundingClientRect=false } = mark

    // 夹角
    if (angle) {
        let { as } = mi
        ctx.save()
        ctx.beginPath()
        _props(ctx, { ...props, strokeDasharray: 0 })
        as.forEach(({ points, a, ia, sweepFlag, o, r, label, labelPos }) => {

            _polyline(ctx, { points })

            if (sweepFlag === 0) {
                // 逆时针  凹点
                ctx.arc(o[0], o[1], r, a - ia, a);
            } else {
                ctx.arc(o[0], o[1], r, a, a + ia);
            }

            // if (Math.abs(ia - Math.PI / 2) < 0.0001) { //Number.EPSILON
            //     // 直角
            // } else {
            //     ctx.arc(o[0], o[1], r, a, a + ia);
            // }

            _text(ctx, label, labelPos, { fontSize: 10, ...props })
        })
        ctx.stroke()
        ctx.fill()
        ctx.restore()
    }

    // 线段长度
    if (edge) {
        let { es } = mi
        ctx.save()
        ctx.beginPath()
        _props(ctx, { strokeDasharray: 4, ...props })
        es.forEach(({ points, label, labelPos }) => {
            _polyline(ctx, { points })
            _text(ctx, label, labelPos, { fontSize: 10, ...props })
        })
        ctx.stroke()
        ctx.restore()
    }

    if (radius) {
        let { rs } = mi
        ctx.save()
        ctx.beginPath()
        _props(ctx, { strokeDasharray: 4, ...props })
        rs.forEach(({ points, label, labelPos }) => {
            _polyline(ctx, { points })
            _text(ctx, label, labelPos, { fontSize: 10, ...props })
        })
        ctx.stroke()
        ctx.restore()
    }

    if (labels) {
        let { ls } = mi
        ctx.save()
        ctx.beginPath()
        ls.forEach(({ label, labelPos }) => {
            _text(ctx, label, labelPos, { fontSize: 10, ...props,strokeDasharray: 0 })
        })
        ctx.stroke()
        ctx.restore()
    }

    if (boundingClientRect) {
        let { bs } = mi
        ctx.save()
        ctx.beginPath()
        _props(ctx, { strokeDasharray: 4, ...props })
        bs.forEach(({ points, label, labelPos }) => {

            _polyline(ctx, { points })
            _text(ctx, label, labelPos, { fontSize: 10, ...props })

            // g[g.length] = _path(_polyline({ points }), { strokeDasharray: 4, ...props, fill: 'none' })

            // g[g.length] = _text({
            //     x: labelPos[0],
            //     y: labelPos[1],
            //     text: label
            // }, { fontSize: 10, ...props, strokeDasharray: 0, textAnchor: 'middle' })
        })

        ctx.stroke()
        ctx.restore()
    }
}